Simon Elsässer, Karolinska Institutet (2023)

Profile plots of promoters, enhancders and significant peaks determined by DESeq2.

bw_dir <- "/Volumes/DATA/DATA/Puck/bigwig/"

library("wigglescout")
library("ggpubr")
library("ggplot2")
library("DESeq2")
Loading required package: SummarizedExperiment
Loading required package: MatrixGenerics
Loading required package: matrixStats

Attaching package: ‘matrixStats’

The following object is masked from ‘package:dplyr’:

    count


Attaching package: ‘MatrixGenerics’

The following objects are masked from ‘package:matrixStats’:

    colAlls, colAnyNAs, colAnys, colAvgsPerRowSet, colCollapse, colCounts, colCummaxs, colCummins,
    colCumprods, colCumsums, colDiffs, colIQRDiffs, colIQRs, colLogSumExps, colMadDiffs, colMads,
    colMaxs, colMeans2, colMedians, colMins, colOrderStats, colProds, colQuantiles, colRanges,
    colRanks, colSdDiffs, colSds, colSums2, colTabulates, colVarDiffs, colVars, colWeightedMads,
    colWeightedMeans, colWeightedMedians, colWeightedSds, colWeightedVars, rowAlls, rowAnyNAs,
    rowAnys, rowAvgsPerColSet, rowCollapse, rowCounts, rowCummaxs, rowCummins, rowCumprods,
    rowCumsums, rowDiffs, rowIQRDiffs, rowIQRs, rowLogSumExps, rowMadDiffs, rowMads, rowMaxs,
    rowMeans2, rowMedians, rowMins, rowOrderStats, rowProds, rowQuantiles, rowRanges, rowRanks,
    rowSdDiffs, rowSds, rowSums2, rowTabulates, rowVarDiffs, rowVars, rowWeightedMads,
    rowWeightedMeans, rowWeightedMedians, rowWeightedSds, rowWeightedVars

Loading required package: Biobase
Welcome to Bioconductor

    Vignettes contain introductory material; view with 'browseVignettes()'. To cite Bioconductor,
    see 'citation("Biobase")', and for packages 'citation("pkgname")'.


Attaching package: ‘Biobase’

The following object is masked from ‘package:MatrixGenerics’:

    rowMedians

The following objects are masked from ‘package:matrixStats’:

    anyMissing, rowMedians
library("dplyr")
library("ggrastr")

clean <- function (fn) {
  fn <- gsub(pattern = ".+/", "", x = fn)
  fn <- gsub(pattern = ".mm9.+", "", x = fn)
  fn <- gsub(pattern = ".mm39.+", "", x = fn)
  fn <- gsub(pattern = "_S.+", "", x = fn)
  fn <- gsub(pattern = "_combined.+", "", x = fn)
  fn <- gsub(pattern = "G4 CnT ", "", x = fn)
  fn <- gsub(pattern = "G4_CnT_", "", x = fn)
  fn <- gsub(pattern = "_batch2", "", x = fn)
  fn <- gsub(pattern = "-", " ", x = fn)
  fn <- gsub(pattern = "_", " ", x = fn)
  fn <- gsub(pattern = " HA ", " ", x = fn)
  fn <- gsub(pattern = "D1D6", "FANCJ-/-", x = fn)
  fn <- gsub(pattern = "P2D2", "DHX36-/-", x = fn)
  fn <- gsub(pattern = "P3D4", "FANCJ-/-DHX36-/-", x = fn)
  return(fn)
}

theme_blank <- theme(axis.line=element_blank(),
      axis.text.x=element_blank(),
      axis.text.y=element_blank(),
      axis.ticks=element_blank(),
      axis.title.x=element_blank(),
      axis.title.y=element_blank(),
      legend.position="none",
      panel.background=element_blank(),
      panel.border=element_blank(),
      panel.grid.major=element_blank(),
      panel.grid.minor=element_blank(),
      plot.background=element_blank())

G4.BWs <- list.files(bw_dir,pattern="G4_CnT_ERCC.+_R..bw",full.names = T)
R.BWs <- list.files(bw_dir,pattern="Rloop_CnT_ERCC.+_R..bw",full.names = T)

mypal <-c("cornflowerblue","orange","red2","#505050")
mypal2 <-c("darkorange2","darkorange2","#505050","#505050")

DJ peaks

non-DJ peaks

replicate consistency

ERCC KO vs WT

replicate consistency

ERCC KO vs WT

top DKO peaks

FANCJ diff peaks

R loops

Rloops DJ

Rloops nonDJ

Rloops FANCJ

facet(p2, facet.by = "name", ncol=6) + coord_cartesian(ylim=c(0,50)) + stat_compare_means(label.y = 45, aes(label = paste0("p=", after_stat(p.format)))) 
Warning: Removed 2 rows containing non-finite outside the scale range (`stat_ydensity()`).
Warning: Removed 2 rows containing non-finite outside the scale range (`stat_summary()`).
Warning: Removed 2 rows containing non-finite outside the scale range (`stat_compare_means()`).

ggsave('panels/panel_G4_Rloop_ERCCKO.pdf',p)
Saving 7 x 7 in image
LS0tCnRpdGxlOiAiRzQgQ1VUJlRhZyBhbmFseXNpcyBtRVNDIChFUkNDIFdUIGFuZCBLTykiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KClNpbW9uIEVsc8Okc3NlciwgS2Fyb2xpbnNrYSBJbnN0aXR1dGV0ICgyMDIzKQoKIyMjIFByb2ZpbGUgcGxvdHMgb2YgcHJvbW90ZXJzLCBlbmhhbmNkZXJzIGFuZCBzaWduaWZpY2FudCBwZWFrcyBkZXRlcm1pbmVkIGJ5IERFU2VxMi4KCmBgYHtyIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTN9CmJ3X2RpciA8LSAiL1ZvbHVtZXMvREFUQS9EQVRBL1B1Y2svYmlnd2lnLyIKCmxpYnJhcnkoIndpZ2dsZXNjb3V0IikKbGlicmFyeSgiZ2dwdWJyIikKbGlicmFyeSgiZ2dwbG90MiIpCmxpYnJhcnkoIkRFU2VxMiIpCmxpYnJhcnkoImRwbHlyIikKbGlicmFyeSgiZ2dyYXN0ciIpCgpjbGVhbiA8LSBmdW5jdGlvbiAoZm4pIHsKICBmbiA8LSBnc3ViKHBhdHRlcm4gPSAiLisvIiwgIiIsIHggPSBmbikKICBmbiA8LSBnc3ViKHBhdHRlcm4gPSAiX1IiLCAiICIsIHggPSBmbikKICBmbiA8LSBnc3ViKHBhdHRlcm4gPSAiLm1tMzkuKyIsICIiLCB4ID0gZm4pCiAgZm4gPC0gZ3N1YihwYXR0ZXJuID0gIi5idyIsICIiLCB4ID0gZm4pCiAgZm4gPC0gZ3N1YihwYXR0ZXJuID0gIi5jb21iaW5lZCIsICIiLCB4ID0gZm4pCiAgZm4gPC0gZ3N1YihwYXR0ZXJuID0gIi4rX0NuVF8iLCAiIiwgeCA9IGZuKQogIGZuIDwtIGdzdWIocGF0dGVybiA9ICJFUkNDXyIsICIiLCB4ID0gZm4pCiAgZm4gPC0gZ3N1YihwYXR0ZXJuID0gIl9iYXRjaDIiLCAiIiwgeCA9IGZuKQogIGZuIDwtIGdzdWIocGF0dGVybiA9ICItIiwgIiAiLCB4ID0gZm4pCiAgZm4gPC0gZ3N1YihwYXR0ZXJuID0gIl8iLCAiICIsIHggPSBmbikKICBmbiA8LSBnc3ViKHBhdHRlcm4gPSAiIEhBICIsICIgIiwgeCA9IGZuKQogIGZuIDwtIGdzdWIocGF0dGVybiA9ICJEMUQ2IiwgIkZBTkNKLS8tIiwgeCA9IGZuKQogIGZuIDwtIGdzdWIocGF0dGVybiA9ICJQMkQyIiwgIkRIWDM2LS8tIiwgeCA9IGZuKQogIGZuIDwtIGdzdWIocGF0dGVybiA9ICJQM0Q0IiwgIkZBTkNKLS8tREhYMzYtLy0iLCB4ID0gZm4pCiAgcmV0dXJuKGZuKQp9Cgp0aGVtZV9ibGFuayA8LSB0aGVtZShheGlzLmxpbmU9ZWxlbWVudF9ibGFuaygpLAogICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksCiAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgYXhpcy50aWNrcz1lbGVtZW50X2JsYW5rKCksCiAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksCiAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X2JsYW5rKCksCiAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICAgIHBhbmVsLmJhY2tncm91bmQ9ZWxlbWVudF9ibGFuaygpLAogICAgICBwYW5lbC5ib3JkZXI9ZWxlbWVudF9ibGFuaygpLAogICAgICBwYW5lbC5ncmlkLm1ham9yPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgcGFuZWwuZ3JpZC5taW5vcj1lbGVtZW50X2JsYW5rKCksCiAgICAgIHBsb3QuYmFja2dyb3VuZD1lbGVtZW50X2JsYW5rKCkpCgpHNC5CV3MgPC0gbGlzdC5maWxlcyhid19kaXIscGF0dGVybj0iRzRfQ25UX0VSQ0MuK19SLi5idyIsZnVsbC5uYW1lcyA9IFQpClIuQldzIDwtIGxpc3QuZmlsZXMoYndfZGlyLHBhdHRlcm49IlJsb29wX0NuVF9FUkNDLitfUi4uYnciLGZ1bGwubmFtZXMgPSBUKQoKbXlwYWwgPC1jKCJjb3JuZmxvd2VyYmx1ZSIsIm9yYW5nZSIsInJlZDIiLCIjNTA1MDUwIikKbXlwYWwyIDwtYygiZGFya29yYW5nZTIiLCJkYXJrb3JhbmdlMiIsIiM1MDUwNTAiLCIjNTA1MDUwIikKYGBgCgojIyBESiBwZWFrcwpgYGB7ciBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD00LCBlcnJvcj1GLGVjaG89Rixwcm9tcHQ9Rix3YXJuaW5nPUZ9CnBsb3RfcHJvZmlsZV9HNF9ESiA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IEc0LkJXcyxsb2NpID0gIi4uL3BlYWtzL0c0X0NuVF9jb21iaW5lZF9wZWFrc19ESi5iZWQiLCBtb2RlPSJjZW50ZXIiLCBsYWJlbHMgPSBjbGVhbihHNC5CV3MpLHNob3dfZXJyb3I9VCxjb2xvcnMgPSBteXBhbDIsIHZlcmJvc2U9RikgKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwxMikpCnBsb3RfcHJvZmlsZV9HNF9ESiRsYWJlbHMkdGl0bGUgPC0gIkc0IENuVCIKcGxvdF9wcm9maWxlX0c0X0RKCmBgYAoKIyMgbm9uLURKIHBlYWtzCmBgYHtyIGZpZy53aWR0aD00LCBmaWcuaGVpZ2h0PTQsIGVycm9yPUYsZWNobz1GLHByb21wdD1GLHdhcm5pbmc9Rn0KcGxvdF9wcm9maWxlX0c0X25vbkRKIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gRzQuQldzLGxvY2kgPSAiLi4vcGVha3MvRzRfQ25UX2NvbWJpbmVkX3BlYWtzX25vbkRKLmJlZCIsIG1vZGU9ImNlbnRlciIsIGxhYmVscyA9IGNsZWFuKEc0LkJXcyksc2hvd19lcnJvcj1ULGNvbG9ycyA9IG15cGFsMiwgdmVyYm9zZT1GKSArIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLDEyKSkKcGxvdF9wcm9maWxlX0c0X25vbkRKJGxhYmVscyR0aXRsZSA8LSAiRzQgQ25UIgpwbG90X3Byb2ZpbGVfRzRfbm9uREoKYGBgCgojIyByZXBsaWNhdGUgY29uc2lzdGVuY3kKYGBge3IgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9NCwgZXJyb3I9RixlY2hvPUYscHJvbXB0PUYsd2FybmluZz1GfQpkZiA8LSBkYXRhLmZyYW1lKGJ3X2xvY2koRzQuQldzLGxvY2k9Ii4uL3BlYWtzL0c0X0NuVF9jb21iaW5lZF9wZWFrc19ESl9ub25ESi5iZWQiKSkKZ2dzY2F0dGVyKGRmLCJHNF9DblRfRVJDQ19XVF9SMSIsIkc0X0NuVF9FUkNDX1dUX1IyIikgKyBnZW9tX2FibGluZShhPTAsYj0xLGxpbmV0eXBlID0gImRvdHRlZCIpCmBgYAoKIyMgRVJDQyBLTyB2cyBXVApgYGB7ciBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD00LCBlcnJvcj1GLGVjaG89Rixwcm9tcHQ9Rix3YXJuaW5nPUZ9CmRmJFdUIDwtIChkZiRHNF9DblRfRVJDQ19XVF9SMStkZiRHNF9DblRfRVJDQ19XVF9SMikvMgpkZiRLTyA8LSAoZGYkRzRfQ25UX0VSQ0NfS09fUjErZGYkRzRfQ25UX0VSQ0NfS09fUjIpLzIKICAgICAgICAgICAgICAKZGYkbGcyZmMgPC0gbG9nKChkZiRLTysxKS8oZGYkV1QrMSksMikKZGYkbGcyV1QgPC0gbG9nKGRmJFdULDIpCgpnZ3NjYXR0ZXIoZGZbZGYkV1Q8MTAwLF0sIldUIiwibGcyZmMiLHNpemU9MC41LGFscGhhPTAuMixhZGQ9ImxvZXNzIixhZGQucGFyYW1zPWxpc3QoY29sb3I9Im9yYW5nZSIpKSArIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsbGluZXR5cGUgPSAiZG90dGVkIixjb2xvcj0ib3JhbmdlIikgKyBzdGF0X3N1bW1hcnlfYmluKGZ1bi55PSJtZWFuIixiaW5zPTIwLGNvbG9yPSJvcmFuZ2UiKQpgYGAKIyMgcmVwbGljYXRlIGNvbnNpc3RlbmN5CmBgYHtyIGZpZy53aWR0aD00LCBmaWcuaGVpZ2h0PTQsIGVycm9yPUYsZWNobz1GLHByb21wdD1GLHdhcm5pbmc9Rn0KcmRmIDwtIGRhdGEuZnJhbWUoYndfbG9jaShSLkJXcyxsb2NpPSIuLi9wZWFrcy9HNF9DblRfY29tYmluZWRfcGVha3NfREpfbm9uREouYmVkIikpCmdnc2NhdHRlcihyZGZbcmRmJFJsb29wX0NuVF9FUkNDX1dUX1IxPDUwMCxdLCJSbG9vcF9DblRfRVJDQ19XVF9SMSIsIlJsb29wX0NuVF9FUkNDX1dUX1IyIikgKyBnZW9tX2FibGluZShhPTAsYj0xLGxpbmV0eXBlID0gImRvdHRlZCIpCmBgYAoKIyMgRVJDQyBLTyB2cyBXVApgYGB7ciBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD00LCBlcnJvcj1GLGVjaG89Rixwcm9tcHQ9Rix3YXJuaW5nPUZ9CnJkZiRXVCA8LSAocmRmJFJsb29wX0NuVF9FUkNDX1dUX1IxK3JkZiRSbG9vcF9DblRfRVJDQ19XVF9SMikvMgpyZGYkS08gPC0gKHJkZiRSbG9vcF9DblRfRVJDQ19LT19SMStyZGYkUmxvb3BfQ25UX0VSQ0NfS09fUjIpLzIKICAgICAgICAgICAgICAKcmRmJGxnMmZjIDwtIGxvZygocmRmJEtPKzEpLyhyZGYkV1QrMSksMikKcmRmJGxnMldUIDwtIGxvZyhyZGYkV1QsMikKCmdnc2NhdHRlcihyZGZbcmRmJFdUPDEwMCxdLCJXVCIsImxnMmZjIixzaXplPTAuNSxhbHBoYT0wLjIsYWRkPSJsb2VzcyIsYWRkLnBhcmFtcz1saXN0KGNvbG9yPSJvcmFuZ2UiKSkgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLGxpbmV0eXBlID0gImRvdHRlZCIsY29sb3I9Im9yYW5nZSIpICsgc3RhdF9zdW1tYXJ5X2JpbihmdW4ueT0ibWVhbiIsYmlucz0yMCxjb2xvcj0ib3JhbmdlIikKYGBgCgoKYGBge3IgZmlnLndpZHRoPTksIGZpZy5oZWlnaHQ9NiwgZXJyb3I9RixlY2hvPUYscHJvbXB0PUYsd2FybmluZz1GfQpzb3J0X3YgPC0gYndfaGVhdG1hcChid2ZpbGVzID0gRzQuQldzWzNdLGxvY2kgPSAiLi4vcGVha3MvRzRfQ25UX2NvbWJpbmVkX3BlYWtzX0RKX25vbkRKLmJlZCIsbW9kZT0iY2VudGVyIilbWzFdXQpzb3J0X28gPC0gb3JkZXIocm93TWVhbnMoc29ydF92KSArIHNjb3JlKGltcG9ydCgiLi4vcGVha3MvRzRfQ25UX2NvbWJpbmVkX3BlYWtzX0RKX25vbkRKLmJlZCIpKSoxMDAwKQoKaDEgPC0gcGxvdF9id19oZWF0bWFwKEc0LkJXc1szXSwiLi4vcGVha3MvRzRfQ25UX2NvbWJpbmVkX3BlYWtzX0RKX25vbkRKLmJlZCIsbW9kZT0iY2VudGVyIixvcmRlcl9ieT1zb3J0X28sbWF4X3Jvd3NfYWxsb3dlZCA9IDIwMCx2ZXJib3NlPUYsIHptYXggPSAyMSkKaDIgPC0gcGxvdF9id19oZWF0bWFwKEc0LkJXc1sxXSwiLi4vcGVha3MvRzRfQ25UX2NvbWJpbmVkX3BlYWtzX0RKX25vbkRKLmJlZCIsbW9kZT0iY2VudGVyIixvcmRlcl9ieT1zb3J0X28sbWF4X3Jvd3NfYWxsb3dlZCA9IDIwMCx2ZXJib3NlPUYsIHptYXggPSAyMSkKaDMgPC0gcGxvdF9id19oZWF0bWFwKFIuQldzWzNdLCIuLi9wZWFrcy9HNF9DblRfY29tYmluZWRfcGVha3NfREpfbm9uREouYmVkIixtb2RlPSJjZW50ZXIiLG9yZGVyX2J5PXNvcnRfbyxtYXhfcm93c19hbGxvd2VkID0gMjAwLHZlcmJvc2U9Riwgem1heCA9IDMwKQpoNCA8LSBwbG90X2J3X2hlYXRtYXAoUi5CV3NbMV0sIi4uL3BlYWtzL0c0X0NuVF9jb21iaW5lZF9wZWFrc19ESl9ub25ESi5iZWQiLG1vZGU9ImNlbnRlciIsb3JkZXJfYnk9c29ydF9vLG1heF9yb3dzX2FsbG93ZWQgPSAyMDAsdmVyYm9zZT1GLCB6bWF4ID0gMzApCgpoNSA8LSBwbG90X2J3X2hlYXRtYXAocGFzdGUwKGJ3X2RpciwiUFFTX3Njb3Jlcy5tbTM5LmJ3IiksIi4uL3BlYWtzL0c0X0NuVF9jb21iaW5lZF9wZWFrc19ESl9ub25ESi5iZWQiLG1vZGU9ImNlbnRlciIsb3JkZXJfYnk9c29ydF9vLG1heF9yb3dzX2FsbG93ZWQgPSAyMDAsdmVyYm9zZT1GLHptaW49Miwgem1heCA9IDEwKQoKcCA8LSBnZ2FycmFuZ2UoaDEsaDIsaDMsaDQsIG5jb2wgPSA0LGNvbW1vbi5sZWdlbmQgPSBUKQpnZ3NhdmUoJ3BhbmVscy9oZWF0bWFwc19HNF9SbG9vcF9FUkNDLnBkZicscCkKcApgYGAKYGBge3IgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9NiwgZXJyb3I9RixlY2hvPUYscHJvbXB0PUYsd2FybmluZz1GfQpzb3J0X3YgPC0gYndfaGVhdG1hcChid2ZpbGVzID0gRzQuQldzWzNdLGxvY2kgPSAiLi4vcGVha3MvRzRfQ25UX2NvbWJpbmVkX3BlYWtzX0RKX25vbkRKLmJlZCIsbW9kZT0iY2VudGVyIilbWzFdXQpzb3J0X28gPC0gb3JkZXIocm93TWVhbnMoc29ydF92KSArIHNjb3JlKGltcG9ydCgiLi4vcGVha3MvRzRfQ25UX2NvbWJpbmVkX3BlYWtzX0RKX25vbkRKLmJlZCIpKSoxMDAwKQoKZDEgPC0gcGxvdF9id19oZWF0bWFwKEc0LkJXc1sxXSxiZ19id2ZpbGUgPSBHNC5CV3NbM10sIi4uL3BlYWtzL0c0X0NuVF9jb21iaW5lZF9wZWFrc19ESl9ub25ESi5iZWQiLG1vZGU9ImNlbnRlciIsb3JkZXJfYnk9c29ydF9vLG1heF9yb3dzX2FsbG93ZWQgPSAyMDAsdmVyYm9zZT1GLG5vcm1fbW9kZSA9ICJsb2cyZmMiKQpkMiA8LSBwbG90X2J3X2hlYXRtYXAoUi5CV3NbMV0sYmdfYndmaWxlID0gUi5CV3NbM10sIi4uL3BlYWtzL0c0X0NuVF9jb21iaW5lZF9wZWFrc19ESl9ub25ESi5iZWQiLG1vZGU9ImNlbnRlciIsb3JkZXJfYnk9c29ydF9vLG1heF9yb3dzX2FsbG93ZWQgPSAyMDAsdmVyYm9zZT1GLG5vcm1fbW9kZSA9ICJsb2cyZmMiKQoKcCA8LSBnZ2FycmFuZ2UoZDEsZDIsIG5jb2wgPSAyLGNvbW1vbi5sZWdlbmQgPSBGKQpnZ3NhdmUoJ3BhbmVscy9oZWF0bWFwc19HNF9SbG9vcF9FUkNDX2RpZmYucGRmJyxwKQpwCmBgYAoKCgojIyB0b3AgREtPIHBlYWtzCmBgYHtyIGZpZy53aWR0aD00LCBmaWcuaGVpZ2h0PTQsIGVycm9yPUYsZWNobz1GLHByb21wdD1GLHdhcm5pbmc9Rn0KcGxvdF9wcm9maWxlX0c0X0RLT190b3AgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBHNC5CV3MsbG9jaSA9ICIuLi9wZWFrcy9HNF9DblRfY29tYmluZWRfcGVha3NfREVTZXFfREtPX3NpZ19sZmNfYmFzZV9jdXRvZmYuYmVkIiwgbW9kZT0iY2VudGVyIiwgbGFiZWxzID0gY2xlYW4oRzQuQldzKSxzaG93X2Vycm9yPVQsY29sb3JzID0gbXlwYWwyLCB2ZXJib3NlPUYpICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsMTMpKQpwbG90X3Byb2ZpbGVfRzRfREtPX3RvcApgYGAKIyMgRkFOQ0ogZGlmZiBwZWFrcwpgYGB7ciBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD00LCBlcnJvcj1GLGVjaG89Rixwcm9tcHQ9Rix3YXJuaW5nPUZ9CnBsb3RfcHJvZmlsZV9HNF9GQU5DSiA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IEc0LkJXcyxsb2NpID0gIi4uL3BlYWtzL0c0X0NuVF9jb21iaW5lZF9wZWFrc19ERVNlcV9GQU5DSl9zaWcuYmVkIiwgbW9kZT0iY2VudGVyIiwgbGFiZWxzID0gY2xlYW4oRzQuQldzKSxzaG93X2Vycm9yPVQsY29sb3JzID0gbXlwYWwyLCB2ZXJib3NlPUYpICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsMTMpKQpwbG90X3Byb2ZpbGVfRzRfRkFOQ0oKYGBgCgpgYGB7ciBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD00LCBlcnJvcj1GLGVjaG89Rixwcm9tcHQ9Rix3YXJuaW5nPUZ9CnBsb3RfcHJvZmlsZV9HNF9UU1NoaSA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IEc0LkJXcyxsb2NpID0gIi4uL2dlbm9tZS9nZW5lc19oaV9sdDEwa2IubW0zOS5iZWQiLCBtb2RlPSJzdGFydCIsIGxhYmVscyA9IGNsZWFuKEc0LkJXcyksc2hvd19lcnJvcj1ULGNvbG9ycyA9IG15cGFsMiwgdmVyYm9zZT1GKSArIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLDMwKSkKcGxvdF9wcm9maWxlX0c0X1RTU2hpCmBgYApgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD00fQpjb21iLkJXcyA8LSBwYXN0ZTAoYndfZGlyLGMoIkc0X0NuVF9FUkNDX1dUX2NvbWJpbmVkLmJ3IiwiRzRfQ25UX0VSQ0NfS09fY29tYmluZWQuYnciKSkKCmRmIDwtIGFzLmRhdGEuZnJhbWUoYndfbG9jaShjb21iLkJXcyxsb2NpPSIuLi9wZWFrcy9HNF9DblRfY29tYmluZWRfcGVha3NfREpfbm9uREouYmVkIixsYWJlbHM9Y2xlYW4oY29tYi5CV3MpKSkKCmRmJGxmYyA8LSBsb2cyKChkZiRLTysxKS8oZGYkV1QrMSkpCmRmIDwtIGRmW3Jvd1N1bXMoZGZbLDY6N10pIDwgMjAwLF0KCm1kZiA8LSByZXNoYXBlMjo6bWVsdChkZlssNjo4XSkKbWRmJHZhcmlhYmxlIDwtIHN1YigiRVJDQy4iLCIiLG1kZiR2YXJpYWJsZSkKcCA8LSBnZ3Zpb2xpbihtZGYsIHg9InZhcmlhYmxlIix5PSJ2YWx1ZSIsZmlsbD0idmFyaWFibGUiLHBhbGV0dGUgPSBteXBhbDJbYygzLDEpXSwgYWRkPSJtZWFuX3NkIiwgdGl0bGUgPSAiRzQgRVJDQzEgS08gdnMgV1QiKSAKZmFjZXQocCwgZmFjZXQuYnkgPSAibmFtZSIsIG5jb2w9NikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsMzApKSArIHN0YXRfY29tcGFyZV9tZWFucyhsYWJlbC55ID0gMzAsIGFlcyhsYWJlbCA9IHBhc3RlMCgicD0iLCBhZnRlcl9zdGF0KHAuZm9ybWF0KSkpKSAKYGBgCgojIFIgbG9vcHMKCiMjIFJsb29wcyBESgoKYGBge3IgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9NCwgZXJyb3I9RixlY2hvPUYscHJvbXB0PUYsd2FybmluZz1GfQpwbG90X3Byb2ZpbGVfUmxvb3BfREogPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBSLkJXcyxsb2NpID0gIi4uL3BlYWtzL0c0X0NuVF9jb21iaW5lZF9wZWFrc19ESi5iZWQiLCBtb2RlPSJjZW50ZXIiLCBsYWJlbHMgPSBjbGVhbihSLkJXcyksc2hvd19lcnJvcj1ULGNvbG9ycyA9IG15cGFsMiwgdmVyYm9zZT1GKSArIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLDI3KSkKcGxvdF9wcm9maWxlX1Jsb29wX0RKJGxhYmVscyR0aXRsZSA8LSAiUi1sb29wIENuVCIKcGxvdF9wcm9maWxlX1Jsb29wX0RKIApgYGAKCiMjIFJsb29wcyBub25ESgpgYGB7ciBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD00LCBlcnJvcj1GLGVjaG89Rixwcm9tcHQ9Rix3YXJuaW5nPUZ9CnBsb3RfcHJvZmlsZV9SbG9vcF9ub25ESiA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IFIuQldzLGxvY2kgPSAiLi4vcGVha3MvRzRfQ25UX2NvbWJpbmVkX3BlYWtzX25vbkRKLmJlZCIsIG1vZGU9ImNlbnRlciIsIGxhYmVscyA9IGNsZWFuKFIuQldzKSxzaG93X2Vycm9yPVQsY29sb3JzID0gbXlwYWwyLCB2ZXJib3NlPUYpICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsMjgpKQpwbG90X3Byb2ZpbGVfUmxvb3Bfbm9uREokbGFiZWxzJHRpdGxlIDwtICJSLWxvb3AgQ25UIgpwbG90X3Byb2ZpbGVfUmxvb3Bfbm9uREoKYGBgCgojIyBSbG9vcHMgRkFOQ0oKYGBge3IgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9NCwgZXJyb3I9RixlY2hvPUYscHJvbXB0PUYsd2FybmluZz1GfQpwbG90X3Byb2ZpbGVfUmxvb3BfRkFOQ0ogPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBSLkJXcyxsb2NpID0gIi4uL3BlYWtzL0c0X0NuVF9jb21iaW5lZF9wZWFrc19ERVNlcV9GQU5DSl9zaWcuYmVkIiwgbW9kZT0iY2VudGVyIiwgbGFiZWxzID0gY2xlYW4oUi5CV3MpLHNob3dfZXJyb3I9VCxjb2xvcnMgPSBteXBhbDIsIHZlcmJvc2U9RikgCnBsb3RfcHJvZmlsZV9SbG9vcF9GQU5DSgpgYGAKYGBge3IgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9NH0KY29tYi5CV3MgPC0gcGFzdGUwKGJ3X2RpcixjKCJSbG9vcF9DblRfRVJDQ19XVF9jb21iaW5lZC5idyIsIlJsb29wX0NuVF9FUkNDX0tPX2NvbWJpbmVkLmJ3IikpCgpkZiA8LSBhcy5kYXRhLmZyYW1lKGJ3X2xvY2koY29tYi5CV3MsbG9jaT0iLi4vcGVha3MvRzRfQ25UX2NvbWJpbmVkX3BlYWtzX0RKX25vbkRKLmJlZCIsbGFiZWxzPWNsZWFuKGNvbWIuQldzKSkpCgpkZiRsZmMgPC0gbG9nMigoZGYkS08rMSkvKGRmJFdUKzEpKQpkZiA8LSBkZltyb3dTdW1zKGRmWyw2OjddKSA8IDIwMCxdCgptZGYgPC0gcmVzaGFwZTI6Om1lbHQoZGZbLDY6OF0pCm1kZiR2YXJpYWJsZSA8LSBzdWIoIkVSQ0MuIiwiIixtZGYkdmFyaWFibGUpCnAyIDwtIGdndmlvbGluKG1kZiwgeD0idmFyaWFibGUiLHk9InZhbHVlIixmaWxsPSJ2YXJpYWJsZSIscGFsZXR0ZSA9IG15cGFsMltjKDMsMSldLCBhZGQ9Im1lYW5fc2QiLCB0aXRsZSA9ICJSLWxvb3AgRVJDQzEgS08gdnMgV1QiKSAKZmFjZXQocDIsIGZhY2V0LmJ5ID0gIm5hbWUiLCBuY29sPTYpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygwLDUwKSkgKyBzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwueSA9IDQ1LCBhZXMobGFiZWwgPSBwYXN0ZTAoInA9IiwgYWZ0ZXJfc3RhdChwLmZvcm1hdCkpKSkgCmBgYAoKCmBgYHtyIGZpZy53aWR0aD03LCBmaWcuaGVpZ2h0PTd9CmxpYnJhcnkoY293cGxvdCkKCnAgPC0gZ2dkcmF3KCkgKwogIGRyYXdfcGxvdChwbG90X3Byb2ZpbGVfRzRfREosIHggPSAwLCB5ID0gLjUsIHdpZHRoID0gLjUsIGhlaWdodCA9IC41KSArCiAgZHJhd19wbG90KHBsb3RfcHJvZmlsZV9HNF9ub25ESiwgeCA9IDAuNSwgeSA9IC41LCB3aWR0aCA9IC41LCBoZWlnaHQgPSAuNSkgKwogIGRyYXdfcGxvdChwbG90X3Byb2ZpbGVfUmxvb3BfREosIHggPSAwLCB5ID0gMCwgd2lkdGggPSAuNSwgaGVpZ2h0ID0gLjUpICsKICBkcmF3X3Bsb3QocGxvdF9wcm9maWxlX1Jsb29wX25vbkRKLCB4ID0gLjUsIHkgPSAwLCB3aWR0aCA9IC41LCBoZWlnaHQgPSAuNSkgKwoKICBkcmF3X3Bsb3RfbGFiZWwobGFiZWwgPSBjKCJhIiwgImIiLCAiYyIsImQiKSwgc2l6ZSA9IDE1LAogICAgICAgICAgICAgICAgICB4ID0gYygwLCAuNSwgMCwgLjUpLCB5ID0gYygxLCAxLCAuNSwgLjUpKQpnZ3NhdmUoJ3BhbmVscy9wYW5lbF9HNF9SbG9vcF9FUkNDS08ucGRmJyxwKQpwCmBgYA==